package main

import (
	"fmt"
)

type ListNode struct {
	Val int
	Next *ListNode
}

func main() {
	fmt.Println("fff")
}

/**
思路：
1. 将 curr 的下一个节点保存到 next 指针;
2. curr 指向 prev, 然后 curr 和  prev 一起前进一步;
3. 重复前面的步骤，直到 k 个元素翻转完毕;
4. 此时完成了 k 个元素的局部翻转，prev 是翻转后的链表头，curr 是下一个要被处理的链表头，head 是翻转后的链表尾
*/
func reverseKGroup(head *ListNode, k int) *ListNode {
	if !checkTimesOfK(head, k) {
		return head
	}

	var prev, curr, next *ListNode = nil, head, nil
	i := k

	for curr != nil && i > 0 {
		next = curr.Next
		curr.Next = prev
		prev = curr
		curr = next
		i--
	}

	if curr != nil {
		head.Next = reverseKGroup(curr, k)
	}

	return prev
}

// 判断链表的长度是否是 k 的整数倍
func checkTimesOfK(head *ListNode, k int) bool {
	for head != nil && k > 0{
		head = head.Next
		k--
	}

	if k > 0 {
		return false
	}

	return true
}
